/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.applet.Applet;
import GameLib.Game;
import java.awt.Point;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Event;
import java.awt.Image;
import java.applet.AudioClip;


/**
 *
 * @author angela
 */
public class Applet1 extends Game{

   // Aquí se declaran nuestras variables
	boolean PAUSE = true;
	int maxlong = 500;
	//Point serpiente[] = new Point[maxlong];
	//Point manzana = new Point (100, 100);
        Rectangle serpiente[] = new Rectangle[maxlong];
	Rectangle manzana = new Rectangle (100, 100, 10, 10);
        Rectangle texto = new Rectangle (100, 100, 100, 100);
        String[]  conceptos= new String [10];
        String[]  titulos= new String [10];
        String[]  conceptos2= new String [10];
	int direccion = 1;
	int longitud = 1;
	boolean gameover;
        boolean leible;
        boolean mensaje = false;
        boolean esperar;
        Image iSerpiente, iManzana, iFondo;
	AudioClip aComer, aMorir;
        int numero;

        
        
	public void init()
	{
		// Comienza descarga asíncrona de recursos pesados
                this.setSize(350, 200);
                setBackground(Color.black);
                
                iSerpiente = this.getImage (this.getCodeBase(), "media/body.gif");
		iManzana = this.getImage (this.getCodeBase(), "media/apple.gif");
		iFondo = this.getImage(this.getCodeBase(), "media/grass1.png");
		aComer = this.getAudioClip (this.getCodeBase(), "media/chomp.au");
		aMorir = this.getAudioClip (this.getCodeBase(), "media/dies.au");
                titulos[0]="Virtualizacion: ";
                conceptos[0]= "Creación de una versión virtual";
                conceptos2[0]=" de algún recurso tecnológico";
                titulos[1]="Tipos de Virtualizacion: ";
                conceptos[1]= "Completa,Parcial y por Sistema Operativo";
                conceptos2[1]= "";
                titulos[2]="Virtualizacion por Hardware: ";
                conceptos[2]= "Extensiones introducidas en la arquitectura de ";
                conceptos2[2]= "procesador x86";
                titulos[3]="La virtualización de almacenamiento: ";
                conceptos[3]="Proceso de abstraer el almacenamiento lógico del";
                conceptos2[3]="almacenamiento físico";
                titulos[4]="Hypervisor ó Monitor de maquina virtual: ";
                conceptos[4]="Plataforma que permite aplicar diversas técnicas ";
                conceptos2[4]="de control de virtualización";
                titulos[5]="Infraestructura Virtual: ";
                conceptos[5]="Mapping dinámico de recursos físicos en función";
                conceptos2[5]="de las necesidades de la empresa.";
                titulos[6]="La virtualización completa: ";
                conceptos[6]="Simular un hardware suficiente para permitir ";
                conceptos2[6]="un sistema operativo “huésped”";
                titulos[7]="La virtualización Parcial: ";
                conceptos[7]="Simular múltiples instancias de gran parte ";
                conceptos2[7]="del entorno subyacente del hardware";
                titulos[8]="La virtualización de Sistema Operativo: ";
                conceptos[8]="Instalar un sistema operativo dentro de otro ";
                conceptos2[8]="al que se le llama anfitrión (HOST)";
                titulos[9]="Programas para virtualizasr S.O: ";
                conceptos[9]="VMware, Virtual Pc, Virtual Box,";
                conceptos2[9]=" Windows Server 2008 R2 Hyper-V,Xen,OpenVZ";
                
		for (int i = 0; i < maxlong; i++)
		{
			//serpiente[i] = new Point(0, 0);
                        serpiente[i] = new Rectangle(0, 0, 10, 10);
		}
	}

	public void game()
	{
		// Aquí va el código de nuestro juego
		if (!PAUSE && !esperar)
		{
			//	Se mueve el serpiente
			for (int i = longitud; i > 0; i--)
			{
				serpiente[i].x = serpiente[i-1].x;
				serpiente[i].y = serpiente[i-1].y;
			}
				
			//	Se mueve el serpiente[0]
			switch	(direccion)
			{
				case 0:
					serpiente[0].y -= 10;
					break;
				case 1:
					serpiente[0].x += 10;
					break;
				case 2:
					serpiente[0].y += 10;
					break;
				case 3:
					serpiente[0].x -= 10;
					break;
			}
			leible = true;
			//	Salida del escenario
			if (serpiente[0].x < 0)
			{
				serpiente[0].x = this.getWidth()-10;
			}
			if (serpiente[0].x > this.getWidth()-10)
			{
				serpiente[0].x = 0;
			}
			if (serpiente[0].y < 10)
			{
				serpiente[0].y = this.getHeight()-10;
			}
			if (serpiente[0].y > this.getHeight()-10)
			{
				serpiente[0].y = 10;
			}
			
			//	Colisión serpiente[0]-Manzana
			//if (serpiente[0].x == manzana.x && serpiente[0].y == manzana.y)
			/*{
				longitud += 1;
				manzana.x = (int)(Math.random() * (this.getWidth()/10 - 1)) * 10;
				manzana.y = (int)(Math.random() * (this.getHeight()/10 - 2)) * 10 + 10;
			}*/
                            
                        if (serpiente[0].intersects(manzana))
			{
				if (longitud < maxlong)
					longitud += 1;
				aComer.play();
				manzana.x = (int)(Math.random() * (this.getWidth()/10 - 1)) * 10;
				manzana.y = (int)(Math.random() * (this.getHeight()/10 - 2)) * 10 + 10;
                                mensaje= true;
                                esperar =true;
                                numero= (int)(Math.random() * 10) ;
			}

                        
                        
                        //	Colisión con el serpiente
				for (int i = 2; i < longitud; i++)
				{
					if (serpiente[0].x == serpiente[i].x && serpiente[0].y == serpiente[i].y)
					{
						PAUSE = true;
						gameover = true;
					}
				}
                      /*  if (serpiente[0].intersects(manzana))
			{
				if (longitud < maxlong)
					longitud += 1;
				aComer.play();
				manzana.x = (int)(Math.random() * (this.getWidth()/10 - 1)) * 10;
				manzana.y = (int)(Math.random() * (this.getHeight()/10 - 2)) * 10 + 10;
			}*/

		}
	}
	
	public void paint(Graphics g)
	{
		// Aquí se dibujan todos los objetos
		//g.clearRect(0, 0, this.getWidth(), this.getHeight());
		//g.setColor(Color.green);
                g.drawImage(iFondo, 0, 0, this);
                

		for (int i = 0; i < longitud; i++)
		{
			//g.drawOval(serpiente[i].x, serpiente[i].y, 10, 10);
                        g.drawImage(iSerpiente, serpiente[i].x, serpiente[i].y, this);

		}
		//g.setColor(Color.red);
		//g.drawOval(manzana.x, manzana.y, 10, 10);
                g.drawImage(iManzana, manzana.x, manzana.y, this);
		g.setColor(Color.white);
		g.drawString("Longitud: " + longitud, 10, 10);
		if (gameover)
		{
			g.drawString("GAME OVER", this.getWidth()/2-30, this.getHeight()/2);
		}
		else if (PAUSE)
		{
			g.drawString("PAUSA", this.getWidth()/2-20, this.getHeight()/2);
		}
                if (mensaje)
                {
                    g.setColor(Color.ORANGE);
                    g.drawString(titulos[numero],10,30);  
                    g.setColor(Color.PINK);
                    g.drawString( conceptos[numero],10,40);
                    g.drawString( conceptos2[numero],10,50);
                    
                       
                }
                
	}
	
	public boolean keyDown(Event e, int key)
	{
		switch(key)
		{
			//	Cambia el rumbo de la serpiente
			case Event.UP:
				if (direccion != 2 && leible)
				{
					direccion = 0;
					leible = false;
                                       // mensaje= false;
				}
				break;
			case Event.RIGHT:
				if (direccion != 3 && leible)
				{
					direccion = 1;
					leible = false;
                                       // mensaje= false;
				}
				break;
			case Event.DOWN:
				if (direccion != 0 && leible)
				{
					direccion = 2;
					leible = false;
                                       // mensaje= false;
				}
				break;
			case Event.LEFT:
				if (direccion != 1 && leible)
				{
					direccion = 3;
					leible = false;
                                      //  mensaje= false;
				}
				break;
			case Event.ENTER:
				PAUSE = !PAUSE;
				if (gameover)
				{
					reset();
				}
				break;
                        case Event.BACK_SPACE:
                             esperar = false;
                             mensaje= false;
                             break;
		}
		return true;
	}
        public void reset()
	{
		serpiente[0].x=50;
		serpiente[0].y=50;
		direccion = 1;
		longitud = 3;
		manzana.x = (int)(Math.random() * (this.getWidth()/10 - 1)) * 10;
		manzana.y = (int)(Math.random() * (this.getHeight()/10 - 2)) * 10 + 10;
		gameover = false;
                mensaje= false;
	}
}